package com.uam.core.lk.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * Copyright：botBrain.ai
 * Author: SongXiaoGuang
 * Date: 2017/12/29.
 * Description:
 */
public class CommonUtil {

    public final static Logger log = LoggerFactory.getLogger(CommonUtil.class);

    /**
     * @param str 要验证的字符串
     * @param regEx 正则表达式
     * @return
     */
    public static boolean matchStr(String str, String regEx){
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        // 字符串是否与正则表达式相匹配
        return matcher.matches();
    }

    /**
     * 验证密码
     * @param pwd
     * @return
     */
    public static boolean validatePwd(String pwd){

        // 判断密码长度是否在6-16位
        int l = pwd.length();
        if(l < 6 || l > 16){
            log.error("{} : 长度不合法", pwd);
            return false;
        }
        for(int i = 0; i<l; i++){
            String p = String.valueOf(pwd.charAt(i));
            //判断密码是否包含数字 ".*\\d+.*"  判断密码是否包含字母  ".*[a-zA-Z]+.*"  判断密码是否包含特殊符号 ".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*"
            if(!p.matches(".*\\d+.*") && !p.matches(".*[a-zA-Z]+.*")
                    && !p.matches(".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*")){
                log.error("{} : 包含特殊字符", pwd);
                return false;
            }
        }
        return true;
    }


    //生成数字验证码
    public static final String genCode(int len) {
        char[] numbs = "0123456789".toCharArray();
        Random r = new Random(System.currentTimeMillis());
        char[] code = new char[len];
        for (int i = 0; i < code.length; i++) {
            code[i] = numbs[r.nextInt(10)];
        }
        return new String(code);
    }

    /**
     * 正则表达式：验证用户名
     */
    public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,20}$";

    /**
     * 正则表达式：验证密码
     */
    public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,20}$";


    /**
     * 正则表达式：验证邮箱
     */
    public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

    /**
     * 正则表达式：验证汉字
     */
    public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";

    /**
     * 正则表达式：验证身份证
     */
    public static final String REGEX_ID_CARD = "(^\\d{18}$)|(^\\d{15}$)";

    /**
     * 正则表达式：验证URL
     */
    public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";

    /**
     * 正则表达式：验证IP地址
     */
    public static final String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";

    /**
     * 校验用户名
     *
     * @param username
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isUsername(String username) {
        return Pattern.matches(REGEX_USERNAME, username);
    }

    /**
     * 校验密码
     *
     * @param password
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isPassword(String password) {
        return Pattern.matches(REGEX_PASSWORD, password);
    }


    /**
     * 校验邮箱
     *
     * @param email
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isEmail(String email) {
        return Pattern.matches(REGEX_EMAIL, email);
    }

    /**
     * 校验汉字
     *
     * @param chinese
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isChinese(String chinese) {
        return Pattern.matches(REGEX_CHINESE, chinese);
    }

    /**
     * 校验身份证
     *
     * @param idCard
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isIDCard(String idCard) {
        return Pattern.matches(REGEX_ID_CARD, idCard);
    }

    /**
     * 校验URL
     *
     * @param url
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isUrl(String url) {
        return Pattern.matches(REGEX_URL, url);
    }

    /**
     * 校验IP地址
     *
     * @param ipAddr
     * @return
     */
    public static boolean isIPAddr(String ipAddr) {
        return Pattern.matches(REGEX_IP_ADDR, ipAddr);
    }

    /**
     * 生成随机字符串
     * @param length
     * @return
     */
    public static String getRandomString(int length) { //length表示生成字符串的长度
        String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

    public static String geneCommonUUID() {
        return UUID.randomUUID().toString().replaceAll("\\-", "");
    }

    /**
     * 大陆号码或香港号码均可
     */
    public static boolean isMobile(String str){
        return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
    }
    /**
     * 处理手机号
     */
    public static String handleInputMobileStr(String str) {
        // 去除两端空格
        str = str.trim();
        // 去除非数字字符
        Pattern p = Pattern.compile("[^0-9]");
        Matcher m = p.matcher(str);
        str = m.replaceAll("");
        return str;
    }

    /**
     * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数
     * 此方法中前三位格式有：
     * 13+任意数
     * 15+除4的任意数
     * 18+除1和4的任意数
     * 17+除9的任意数
     * 147
     */
    public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
        String regExp = "^((13[0-9])|(14[0-9])|(15[^4])|(16[0-9])|(19[0-9])|(18[0-9])|(17[0-8])|(147))\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 香港手机号码8位数，5|6|8|9开头+7位任意数
     */
    public static boolean isHKPhoneLegal(String str)throws PatternSyntaxException {
        String regExp = "^(5|6|8|9)\\d{7}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    public static void main(String[] args) {
		for (int i = 0; i < 100; i++ ) {
			System.out.println(getRandom(2, 0));
		}
    }

	/**
	 *
	 * @Title: getRandom
	 * @author: zhangxj
	 * @date:   2019年9月20日 下午12:21:26
	 * @Description: 获取随机数
	 * 获取两个正整数数值范围的随机数
	 * @param: @param max
	 * @param: @param min
	 * @param: @return
	 * @return: int
	 * @throws
	 */
	public static int getRandom(int max, int min){
		if(max < 0){
			max = 0;
		}
		if(min < 0){
			min= 0;
		}
		if(min== 0 && max == 0){
			return 0;
		}
		if(min > max){
			int temp = max;
			max = min;
			min = temp;
		}
		Random random = new Random();
		return random.nextInt(max)%(max-min+1) + min;
	}
}
